package com.zmn.plat.persistence.interfaces.company;

import com.zmn.common.dictionary.DictModel;
import com.zmn.common.dto.StatusDTO;
import com.zmn.mcc.permit.mysql.annotation.ZmnDPermitConfig;
import com.zmn.mcc.permit.mysql.annotation.ZmnDPermitType;
import com.zmn.mcc.permit.mysql.enums.DPermitTypeEnum;
import com.zmn.plat.model.entity.company.BaseCompany;
import com.zmn.plat.model.entity.company.BaseCompanyQuery;
import com.zmn.plat.model.entity.company.CompanyTypeQuery;
import com.zmn.plat.model.vo.company.BaseCompanyVO;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;

/**
 * @author duanzuocai
 * @version v1.0
 * @类说明：公司DAO
 * @since 2018/10/16 13:57
 */
public interface CompanyDao {

    /**
     * 通过主键查询
     *
     * @param companyId 公司ID
     * @return
     */
    BaseCompanyVO findByKey(Integer companyId);

    /**
     * 通过主键查询
     *
     * @param query 查询条件
     * @return
     */
    BaseCompany findFristByQuery(BaseCompanyQuery query);

    /**
     * 通过平台查询第一个公司
     *
     * @param plat
     * @return
     */
    BaseCompany findOneByPlat(@Param("plat") Integer plat);

    /**
     * 通过名称查询
     *
     * @param name 公司名称
     * @return
     */
    BaseCompany findByName(String name);

    /**
     * 公司名称（工商注册名称）查询
     *
     * @param fullName 公司名称
     * @return
     */
    BaseCompany findByFullName(String fullName);

    /**
     * 查询公司
     *
     * @param ids
     * @param type 数据类型
     * @return
     */
    List<BaseCompany> findByKeys(@Param("ids") List<Integer> ids, @Param("type") Integer type, @Param("childType") Integer childType, @Param("status") Integer status);

    /**
     * 根据名称集合查询公司基本信息
     *
     * @param names 公司名称集合
     * @return 公司集合
     */
    List<BaseCompany> listCompanyByNameList(@Param("names") List<String> names);

    /**
     * 查询公司
     *
     * @param ids
     * @param companyTypeQueryList 公司类型集合
     * @return
     */
    List<BaseCompany> findByKeysAndTypes(@Param("ids") List<Integer> ids, @Param("companyTypeQueryList") List<CompanyTypeQuery> companyTypeQueryList, @Param("status") Integer status, @Param("plat") Integer plat);

    /**
     * 分页查询
     *
     * @param query 条件
     * @return
     */
    @ZmnDPermitConfig(alias = "c", types = {DPermitTypeEnum.ORG_ONE, DPermitTypeEnum.ORG_TWO, DPermitTypeEnum.ORG_THR}
            , mapping = {@ZmnDPermitType(type = DPermitTypeEnum.COMP_SP, column = "company_id")}, staffId = "query.operatorId")
    List<BaseCompanyVO> listPageByQuery(BaseCompanyQuery query);

    /**
     * 查询列表
     *
     * @param query 条件
     * @return
     */
    List<BaseCompany> listByQuery(BaseCompanyQuery query);

    /**
     * 查询列表：VO
     *
     * @param query
     * @return
     */
    List<BaseCompanyVO> listVOByQuery(BaseCompanyQuery query);

    /**
     * 查询公司
     *
     * @param orgIds 组织架构ID
     * @param type   公司类型
     * @return
     */
    List<BaseCompany> listByOrganIds(@Param("orgIds") List<Integer> orgIds, @Param("type") Integer type, @Param("childType") Integer childType);

    /**
     * 通过一级组织架构查询第三级的所有公司
     *
     * @param orgId
     * @return
     */
    List<BaseCompany> listCompanyByOrganLevelOne(Integer orgId);

    /**
     * 通过一级组织架构查询第四级的所有公司
     *
     * @param orgId
     * @return
     */
    List<BaseCompany> listElectricCompanyByOrganLevelOne(Integer orgId);

    /**
     * 通过二级组织架构查询第三级的所有公司
     *
     * @param orgId
     * @return
     */
    List<BaseCompany> listCompanyByOrganLevelTwo(Integer orgId);

    /**
     * 描述: 根据类型，平台标志查询公司信息
     *
     * @param companyTypeQueryList 公司类型集合
     * @param plat                 平台标志：1.言而有信 2.啄木鸟,3川南环保
     * @return java.util.List<com.zmn.plat.model.entity.company.BaseCompany>
     * @author wangjie
     * @since 14:50 2019/6/14
     **/
    List<BaseCompany> listCompanyByTypes(@Param(value = "companyTypeQueryList") List<CompanyTypeQuery> companyTypeQueryList, @Param(value = "plat") Integer plat);

    /**
     * 描述: 根据类型，平台标志查询公司信息
     *
     * @param companyTypeQueryList 公司类型集合
     * @param plats                平台标志：1.言而有信 2.啄木鸟,3川南环保
     * @return java.util.List<com.zmn.plat.model.entity.company.BaseCompany>
     * @author wangjie
     * @since 14:50 2019/6/14
     **/
    List<BaseCompany> listCompanyByTypesAndPlats(@Param(value = "companyTypeQueryList") List<CompanyTypeQuery> companyTypeQueryList, @Param(value = "plats") List<Integer> plats);

    /**
     * 描述: 根据公司id和状态查询，mcc数据权限使用
     *
     * @return java.util.List<com.zmn.plat.model.entity.company.BaseCompany>
     * @author wangjie
     * @since 14:50 2019/6/14
     **/
    @ZmnDPermitConfig(alias = "base_company", types = {DPermitTypeEnum.ORG_THR}, staffId = "query.operatorId"
            , mapping = {@ZmnDPermitType(type = DPermitTypeEnum.COMP_SP, column = "sub_company_id")})
    List<BaseCompany> listByQueryForMcc(BaseCompanyQuery query);
    /**
     * 描述: 根据修改时间查询大于该时间状态为禁用的数据
     *
     * @param updateTime           修改时间
     * @param companyTypeQueryList 公司类型集合
     * @param plat                 平台标志：1.言而有信 2.啄木鸟,3川南环保
     * @return java.util.List<com.zmn.plat.model.entity.company.BaseCompany>
     * @author wangjie
     * @since 17:26 2019/7/11
     **/
    List<BaseCompanyVO> listCompanyByUpdateTime(@Param(value = "updateTime") Date updateTime,
                                              @Param(value = "companyTypeQueryList") List<CompanyTypeQuery> companyTypeQueryList,
                                              @Param("plat") Integer plat);

    /**
     * 描述:查询搜索服务商
     *
     * @param query 公司查询对象
     *              plat      平台标识，1言而有信，2啄木鸟，3一步维修，4川南环保，Null不限
     *              areaId    大区的组织架构Id，Null不限
     *              companyId 子公司Id，Null不限
     *              type      服务商类型，Null不限 (1,7,9)
     *              status    服务商状态，1禁用，2启用，Null不限
     *              keyword   服务商名称，支持中文及拼音模糊搜索，Null不限
     *              java.util.List<com.zmn.common.dto.VtDTO> 服务商公司Id、公司名称和状态字段列表
     * @return java.util.List<com.zmn.plat.model.entity.company.BaseCompany>
     * @author wangjie
     * @since 2019/9/5
     **/
    List<BaseCompany> listManageCompanyVtByQuery(BaseCompanyQuery query);

    /**
     * 描述: 查询搜索服务商
     *
     * @param plat      平台标识，1言而有信，2啄木鸟，3一步维修，4川南环保，Null不限
     * @param bigAreaId 大区的组织架构Id，Null不限
     * @param companyId 子公司Id，Null不限
     * @param type      服务商类型，Null不限 (1,7,9)
     * @param childType 公司子类型
     * @param status    服务商状态，1禁用，2启用，Null不限
     * @param keyword   服务商名称，支持中文及拼音模糊搜索，Null不限
     * @return BaseCompany 公司完整信息
     **/
    List<BaseCompany> listManageCompany(@Param(value = "plat") Integer plat, @Param(value = "bigAreaId") Integer bigAreaId
            , @Param(value = "companyId") Integer companyId, @Param(value = "type") Integer type, @Param(value = "childType") Integer childType
            , @Param(value = "status") Integer status, @Param(value = "keyword") String keyword);

    /**
     * 描述: 查询搜索服务商
     *
     * @param plat      平台标识，1言而有信，2啄木鸟，3一步维修，4川南环保，Null不限
     * @param type      服务商类型，Null不限 (1,7,9)
     * @param childType 公司子类型
     * @param status    服务商状态，1禁用，2启用，Null不限
     * @param keyword   服务商名称，支持中文及拼音模糊搜索，Null不限
     * @return BaseCompany 公司完整信息
     **/
    List<BaseCompany> listManageCompanyByNoOrgan(@Param(value = "plat") Integer plat,
                                                 @Param(value = "type") Integer type,
                                                 @Param(value = "childType") Integer childType
            , @Param(value = "status") Integer status, @Param(value = "keyword") String keyword);

    /**
     * 描述: 根据平台城市和公式id查询公式Id
     *
     * @param plat
     * @param cityId
     * @param companyId
     * @return java.util.List<com.zmn.plat.model.entity.company.BaseCompany>
     * @author jiafei
     * @since 2021/9/15 21:09
     */
    List<BaseCompany> listByPlatAndCityIdAndCompanyId(BaseCompanyQuery query);

    /**
     * 统计数量
     *
     * @param query 条件
     * @return
     */
    @ZmnDPermitConfig(alias = "c", types = {DPermitTypeEnum.ORG_ONE, DPermitTypeEnum.ORG_TWO, DPermitTypeEnum.ORG_THR}
            , mapping = {
            @ZmnDPermitType(type = DPermitTypeEnum.COMP_SP, column = "company_id")}, staffId = "query.operatorId")
    Integer countByQuery(BaseCompanyQuery query);

    /**
     * 通过主键更新
     *
     * @param company 公司
     * @return
     */
    Integer updateByKey(BaseCompany company);

    /**
     * 通过主键更新,字段为空不更新
     *
     * @param company 公司
     * @return
     */
    Integer updateByKeySelective(BaseCompany company);

    /**
     * 批量更新状态
     *
     * @param dto 条件
     * @return
     */
    int updateStatusBatch(StatusDTO dto);

    /**
     * 更新排序
     *
     * @param company
     * @return
     * @author tanbiao
     */
    Integer updateSortByKey(BaseCompany company);

    /**
     * 更新公司code
     *
     * @param companyId
     */
    void updateCodeByKey(Integer companyId);

    /**
     * 添加公司
     *
     * @param company 公司对象
     * @return
     */
    Integer insert(BaseCompany company);

    /**
     * 删除公司
     *
     * @param companyId id
     * @return
     */
    Integer deleteByKey(Integer companyId);

}
